package co.edu.udea.herbario.dao;

import co.edu.udea.herbario.util.ConstantesStatic;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;

/**
 *Esta clase es la que permite crear la conexion con la base de datos
 *
 * @author Lorena Orozco
 */
public class Conexion
{
    //Atributo estatico del mismo tipo de la clase
    private static Conexion instancia;

    Connection con; //Atributo en el cual se guarda la conexion
    ResourceBundle propiedadesConexion; //Atributo en el cual se carga los valores de la conexion

    //Atributos para la conexion a la base de datos
    private String usuario;
    private String contrasena;
    private String iphost;
    private String puerto;
    private String namedb;
    private String cadenaConexion;

    //Constructor privado
    private Conexion(){ }
    
    /**
	 * Metodo que permite obtener una instancia de la clase
	 *
	 * @return retorna una instancia de la misma clase
	 */
    public static Conexion obtenerInstancia()
    {
        if(instancia == null)
        {
            instancia = new Conexion();
        }
        return instancia;
    }

    /**
	 * Metodo que permite cargar el archivo de propiedades que contiene los
     * valores de la conexion a la base de datos
	 */
    public void cargarArchivo()
    {
        propiedadesConexion = ResourceBundle.getBundle(ConstantesStatic.PROPERTIES_CONEXION);       

        usuario = propiedadesConexion.getString("usuario");
        contrasena = propiedadesConexion.getString("contrasena");
        iphost = propiedadesConexion.getString("iphost");
        puerto = propiedadesConexion.getString("puerto");
        namedb = propiedadesConexion.getString("namedb");
    }

    /**
	 * Metodo que permite crear la conexion con la base de datos
	 *
	 * @return retorna un objeto de tipo Connection
	 */
    public Connection abrirConexion()
    {
        if(propiedadesConexion == null)
        {
            //Se llama el metodo cargarArchivo para obtener los datos de conexion a la base de datos
            this.cargarArchivo();
        }

        if(con != null)
        {
            return con;
        }        

        try
        {
            Class.forName("oracle.jdbc.OracleDriver");
            cadenaConexion = "jdbc:oracle:thin:@" + iphost + ":" + puerto + ":" + namedb;
            con = DriverManager.getConnection(cadenaConexion,usuario,contrasena);
        }
        catch(ClassNotFoundException cnfe)
        {
            System.err.println("ClassNotFoundException");
            System.err.println("causa: " + cnfe.getCause());
            System.err.println("Mensaje: " + cnfe.getMessage());
            System.err.println("Localizacion: " + cnfe.getLocalizedMessage());
            System.err.println("Traza: " + cnfe.getStackTrace());
        }
        catch(SQLException se)
        {
            System.err.println("SQLException");
            System.err.println("causa: " + se.getCause());
            System.err.println("Mensaje: " + se.getMessage());
            System.err.println("Localizacion: " + se.getLocalizedMessage());
            System.err.println("Traza: " + se.getStackTrace());
        }
        return con;
    }
}
